package it.maganar.lesscaos.client;

import it.maganar.lesscaos.entity.Negoziazione;
import it.maganar.lesscaos.exception.UserNotLoggedException;
import it.maganar.lesscaos.session.ServiceGateRemote;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Date;
import java.util.List;
import java.util.StringTokenizer;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class NegoziazioneWidget {

	
	ServiceGateRemote serviceGate = NetworkConnector.sgr;
	private JFrame frameVisualizza;
	private JPanel pannelloCorpoVisualizza;
	private JLabel titoloVisualizza;
	private List<Negoziazione> listaNegoziazioni;
	private JPanel[] pannelloBottoneNegozia;
	private JButton[] bottoneNegozia;
	int i;
	
	public NegoziazioneWidget(final LessCaosMainWidget lcmw){
		
		
		// ******************* FINESTRA VISUALIZZA NEGOZIAZIONI **********************//
		
		
		// Inizializzazione Frame
		frameVisualizza = new JFrame("LESS-CAOS - Negoziazioni");
		frameVisualizza.setLayout(new BorderLayout());
		
		
		// Inizializzazione e Inserimento pannelli principali
		JPanel pannelloTitoloVisualizza = new JPanel();
		pannelloTitoloVisualizza.setLayout(new FlowLayout());
		pannelloTitoloVisualizza.setBackground(Color.DARK_GRAY);
		frameVisualizza.add(pannelloTitoloVisualizza, BorderLayout.NORTH);
		
		pannelloCorpoVisualizza = new JPanel();
		pannelloCorpoVisualizza.setLayout(new FlowLayout());
		//pannelloCorpo.setBackground(Color.LIGHT_GRAY);
		frameVisualizza.add(pannelloCorpoVisualizza, BorderLayout.CENTER);
		
		JPanel pannelloNegoziazioni = new JPanel();		
		pannelloNegoziazioni.setBackground(Color.white);
		pannelloCorpoVisualizza.add(pannelloNegoziazioni);
		
		GridLayout layout = new GridLayout(1,10);
		//layout.setHgap(20);
		pannelloNegoziazioni.setLayout(layout);
		
		
		// Inizializzazione e Inserimento label
		titoloVisualizza = new JLabel("Negoziazioni presenti");
		titoloVisualizza.setForeground(Color.WHITE);
		pannelloTitoloVisualizza.add(titoloVisualizza);
		
		JLabel lPartenza = new JLabel("Partenza");
		lPartenza.setOpaque(true);
		lPartenza.setBackground(Color.GRAY);
		lPartenza.setForeground(Color.WHITE);
		lPartenza.setPreferredSize(new Dimension(100, 0));
		
		JLabel lArrivo = new JLabel("Arrivo");
		lArrivo.setOpaque(true);
		lArrivo.setBackground(Color.GRAY);
		lArrivo.setForeground(Color.WHITE);

		JLabel lOraPartenza = new JLabel("Ora Partenza");
		lOraPartenza.setOpaque(true);
		lOraPartenza.setBackground(Color.GRAY);
		lOraPartenza.setForeground(Color.WHITE);
		
		JLabel lOraArrivo = new JLabel("Ora Arrivo");
		lOraArrivo.setOpaque(true);
		lOraArrivo.setBackground(Color.GRAY);
		lOraArrivo.setForeground(Color.WHITE);
		
		JLabel lData = new JLabel("Data");
		lData.setOpaque(true);
		lData.setBackground(Color.GRAY);
		lData.setForeground(Color.WHITE);
		
		JLabel lTipoVeicolo = new JLabel("Tipo Veicolo");
		lTipoVeicolo.setOpaque(true);
		lTipoVeicolo.setBackground(Color.GRAY);
		lTipoVeicolo.setForeground(Color.WHITE);
										
		JLabel lIssuer = new JLabel("Issuer");
		lIssuer.setOpaque(true);
		lIssuer.setBackground(Color.GRAY);
		lIssuer.setForeground(Color.WHITE);
		
		JLabel lRequestor = new JLabel("Requestor");
		lRequestor.setOpaque(true);
		lRequestor.setBackground(Color.GRAY);
		lRequestor.setForeground(Color.WHITE);
		
		JLabel lStato = new JLabel("Stato");
		lStato.setOpaque(true);
		lStato.setBackground(Color.GRAY);
		lStato.setForeground(Color.WHITE);
		
		
		
		JLabel lVuoto = new JLabel("");
		lVuoto.setOpaque(true);
		lVuoto.setBackground(Color.GRAY);//pannelloCorpoVisualizza.getBackground());
		
		pannelloNegoziazioni.add(lPartenza);//, JLabel.CENTER));
		pannelloNegoziazioni.add(lArrivo);//, JLabel.CENTER));			
		pannelloNegoziazioni.add(lOraPartenza);//, JLabel.CENTER));
		pannelloNegoziazioni.add(lOraArrivo);//, JLabel.CENTER));
		pannelloNegoziazioni.add(lData);//, JLabel.CENTER));
		pannelloNegoziazioni.add(lTipoVeicolo);//, JLabel.CENTER));
		pannelloNegoziazioni.add(lIssuer);
		pannelloNegoziazioni.add(lRequestor);
		pannelloNegoziazioni.add(lStato);
		pannelloNegoziazioni.add(lVuoto);
		
		frameVisualizza.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent event) {
				lcmw.setVisible(true);
	        } 
	    });
			
		
		listaNegoziazioni = null;
		
		try {					
			listaNegoziazioni = serviceGate.ottieniListaNegoziazioni();
			//+++ Inserimento Negoziazione +++//
			if (!listaNegoziazioni.isEmpty()){
				layout.setRows(listaNegoziazioni.size()+1);
				pannelloBottoneNegozia = new JPanel[listaNegoziazioni.size()];
				bottoneNegozia = new JButton[listaNegoziazioni.size()];
				
				for (i=0; i<listaNegoziazioni.size(); i++){
					JLabel ldPartenza = new JLabel(listaNegoziazioni.get(i).getProposta().getPartenza().getIndirizzo());
					JLabel ldArrivo = new JLabel(listaNegoziazioni.get(i).getProposta().getArrivo().getIndirizzo());												
					JLabel ldOrarioPart = new JLabel(listaNegoziazioni.get(i).getProposta().getPartenza().getOrario().toString());
					JLabel ldOrarioArr = new JLabel(listaNegoziazioni.get(i).getProposta().getArrivo().getOrario().toString());						
					//data
					Date data = listaNegoziazioni.get(i).getProposta().getIscrizione().getData();
					JLabel ldData;
					if(data == null) ldData = new JLabel("giornaliera");
					else ldData = new JLabel(data.toString());
					// fine data
					JLabel ldVeicolo = new JLabel(listaNegoziazioni.get(i).getProposta().getIscrizione().getTipoVeicolo().toString());
					JLabel ldIssuer = new JLabel(listaNegoziazioni.get(i).getIssuer().getNome()+" "+
							listaNegoziazioni.get(i).getIssuer().getCognome());
					JLabel ldRequestor = new JLabel(listaNegoziazioni.get(i).getRequestor().getNome()+" "+
							listaNegoziazioni.get(i).getRequestor().getCognome());
					JLabel ldStato = new JLabel(String.valueOf(listaNegoziazioni.get(i).getStato()));
											
					ldPartenza.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldPartenza.setOpaque(true); ldPartenza.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldPartenza);
					
					ldArrivo.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldArrivo.setOpaque(true); ldArrivo.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldArrivo);							
					
					ldOrarioPart.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldOrarioPart.setOpaque(true); ldOrarioPart.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldOrarioPart);
					
					ldOrarioArr.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldOrarioArr.setOpaque(true); ldOrarioArr.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldOrarioArr);
					
					ldData.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldData.setOpaque(true); ldData.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldData);
					
					ldVeicolo.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldVeicolo.setOpaque(true); ldVeicolo.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldVeicolo);
																
					ldIssuer.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldIssuer.setOpaque(true); ldIssuer.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldIssuer);
					
					ldRequestor.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldRequestor.setOpaque(true); ldRequestor.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldRequestor);
					
					ldStato.setVerticalAlignment(JLabel.TOP);
					if (i%2 == 1){ ldStato.setOpaque(true); ldStato.setBackground(pannelloCorpoVisualizza.getBackground()); }
					pannelloNegoziazioni.add(ldStato);
				
					
					// bottoni
					
					pannelloBottoneNegozia[i] = new JPanel();
					pannelloBottoneNegozia[i].setLayout(new FlowLayout());
					if (i%2 == 1) pannelloBottoneNegozia[i].setBackground(pannelloCorpoVisualizza.getBackground());
					else pannelloBottoneNegozia[i].setBackground(Color.WHITE);
					pannelloNegoziazioni.add(pannelloBottoneNegozia[i]);
					
					bottoneNegozia[i] = new JButton("Negozia");
					pannelloBottoneNegozia[i].add(bottoneNegozia[i]);
					
					
					//coloramento/attivazione negozia
					
					if (listaNegoziazioni.get(i).getStato()==0){ //pending
						ldStato.setText("In corso");
						bottoneNegozia[i].setBackground(Color.YELLOW);
					}
					if (listaNegoziazioni.get(i).getStato()==1){ //accettata
						ldStato.setText("Conclusa");
						bottoneNegozia[i].setBackground(Color.GREEN);
						bottoneNegozia[i].setText("Dettagli");
					}
					if (listaNegoziazioni.get(i).getStato()==2){ //rifiutata
						ldStato.setText("Terminata");
						bottoneNegozia[i].setBackground(Color.RED);
						bottoneNegozia[i].setText("Termine");
						bottoneNegozia[i].setEnabled(false);
					}
					
					
					
					//fine coloramento/attivazione negozia
					
					
					bottoneNegozia[i].addMouseListener( new MouseListener(){
						
						Negoziazione negoziazione = listaNegoziazioni.get(i);
						int cur = i;
						private JFrame frameNegozia;
						private JPanel pannelloTitoloNegozia;
						private JPanel pannelloCorpoNegozia;
						private JPanel pannelloCentraleNegozia;
						private JLabel titoloNegozia;
						private JPanel pannelloFormNegozia;
						private JPanel pannelloBottoneAccetta;
						private JPanel pannelloBottoneRifiuta;
						
						private JButton bottoneAccetta;
						private JButton bottoneRifiuta;
						
						private JTextField areaNuovaCondizione;
						private JPanel pannelloBottoneAggiungiCondizione;
						private JButton bottoneAggiungiCondizione;
						private JPanel pannelloRinegozia;
						
						@Override
						public void mouseClicked(MouseEvent arg0) {}

						@Override
						public void mousePressed(MouseEvent arg0) {
							if (bottoneNegozia[cur].isEnabled()){
							
							
								//******************* DETTAGLIO NEGOZIAZIONE *********************//
								
								
								// ******************* FINESTRA NUOVA DISPONIBILITA **********************//
								
								
								// Inizializzazione Frame
								frameNegozia = new JFrame("LESS-CAOS - Negozia");
								frameNegozia.setLayout(new BorderLayout());
								
								
								// Inizializzazione e Inserimento pannelli principali
								pannelloTitoloNegozia = new JPanel();
								pannelloTitoloNegozia.setLayout(new FlowLayout());
								pannelloTitoloNegozia.setBackground(Color.DARK_GRAY);
								frameNegozia.add(pannelloTitoloNegozia, BorderLayout.NORTH);
								
															
								pannelloCorpoNegozia = new JPanel();
								pannelloCorpoNegozia.setLayout(new FlowLayout());
								
								frameNegozia.add(pannelloCorpoNegozia, BorderLayout.CENTER);
								
										
								pannelloCentraleNegozia = new JPanel();
								pannelloCentraleNegozia.setLayout(new BoxLayout(pannelloCentraleNegozia, BoxLayout.Y_AXIS));
								pannelloCorpoNegozia.add(pannelloCentraleNegozia);
								
								
								
								// Inizializzazione e Inserimento label
								titoloNegozia = new JLabel("Negoziato");
								titoloNegozia.setForeground(Color.WHITE);
								pannelloTitoloNegozia.add(titoloNegozia);
								
								// Inizializzazione e Inserimento pannello form
								pannelloFormNegozia = new JPanel();
								GridLayout layout = new GridLayout(3,1);
								
								pannelloFormNegozia.setLayout(layout);
								//pannelloForm.setBackground(Color.LIGHT_GRAY);
								pannelloCentraleNegozia.add(pannelloFormNegozia);
								
								pannelloFormNegozia.add(new JLabel(""));
								JLabel lCond = new JLabel("Condizioni:");
								lCond.setOpaque(true);
								lCond.setBackground(Color.GRAY);
								lCond.setForeground(Color.WHITE);
								
								pannelloFormNegozia.add(lCond);
								pannelloFormNegozia.add(new JLabel(""));
								
								
															
								pannelloBottoneAccetta = new JPanel();
								pannelloBottoneAccetta.setLayout(new FlowLayout());
								pannelloCentraleNegozia.add(pannelloBottoneAccetta);
								
								pannelloBottoneRifiuta = new JPanel();
								pannelloBottoneRifiuta.setLayout(new FlowLayout());
								pannelloCentraleNegozia.add(pannelloBottoneRifiuta);
								
								
								
								
								bottoneAccetta = new JButton("Accetta");
								pannelloBottoneAccetta.add(bottoneAccetta);
								
								bottoneRifiuta= new JButton("Rifiuta");
								pannelloBottoneRifiuta.add(bottoneRifiuta);
								
								pannelloCentraleNegozia.add(Box.createVerticalStrut(20));
								
								pannelloRinegozia = new JPanel();
								pannelloRinegozia.setLayout(new GridLayout(3,1));
								pannelloCentraleNegozia.add(pannelloRinegozia);
															
								
								JLabel lAggCond = new JLabel("Aggiungi condizione:");
								lAggCond.setOpaque(true);
								lAggCond.setBackground(Color.GRAY);
								lAggCond.setForeground(Color.WHITE);
								
								pannelloRinegozia.add(lAggCond);
								
								pannelloRinegozia.add(new JLabel(""));
								
								areaNuovaCondizione = new JTextField(20);
								pannelloRinegozia.add(areaNuovaCondizione);
								
								//pannelloInternoRinegozia.add(new JLabel(""));
								
								pannelloBottoneAggiungiCondizione = new JPanel();
								pannelloBottoneAggiungiCondizione.setLayout(new FlowLayout());
								pannelloCentraleNegozia.add(pannelloBottoneAggiungiCondizione);
								
								bottoneAggiungiCondizione = new JButton("Aggiungi");
								pannelloBottoneAggiungiCondizione.add(bottoneAggiungiCondizione);
								
								
								//controlli
								
								if(negoziazione.getStato()!= 0){ //accettata o rifiutata
									bottoneAccetta.setEnabled(false);
									bottoneRifiuta.setEnabled(false);
									bottoneAggiungiCondizione.setEnabled(false);
									areaNuovaCondizione.setEnabled(false);
									
								}
								
								
								//+++ inserimento condizioni
								
								StringTokenizer st = new StringTokenizer(negoziazione.getCondizioni(), "$");
							    while (st.hasMoreTokens()) {
							         
							    	layout.setRows(layout.getRows()+1);
							    	JLabel lSingCond = new JLabel(st.nextToken());
							    	lSingCond.setOpaque(true);
							    	lSingCond.setBackground(Color.WHITE);
							    	pannelloFormNegozia.add(lSingCond);						    	 
							    }

								
								
					
								//*** EVENT ***//
							    
							    
							    bottoneAccetta.addMouseListener(	new MouseListener() {
									
									@Override
									public void mouseReleased(MouseEvent arg0) {}
									
									@Override
									public void mousePressed(MouseEvent arg0) {
										
										if (bottoneAccetta.isEnabled()){										
											try {
												boolean esito = serviceGate.accettaCondizione(negoziazione);
												if(!esito){
													JOptionPane.showMessageDialog(null, "Non permesso:\nSei già in attesa di risposta", "Informazione", JOptionPane.INFORMATION_MESSAGE);
												}
												else {
													JOptionPane.showMessageDialog(null, "Condizioni accettate", "Informazione", JOptionPane.INFORMATION_MESSAGE);
													frameNegozia.setVisible(false);
													frameVisualizza.setVisible(false);
													lcmw.setVisible(true);
												}
											} catch (UserNotLoggedException e) {
												// mettere il popup
												
											}										
										}
										
									}
									
									@Override
									public void mouseExited(MouseEvent arg0) {}
									
									@Override
									public void mouseEntered(MouseEvent arg0) {}
									
									@Override
									public void mouseClicked(MouseEvent arg0) {}
								
							    });
							    
							    
							    bottoneRifiuta.addMouseListener(	new MouseListener() {
									
									@Override
									public void mouseReleased(MouseEvent arg0) {}
									
									@Override
									public void mousePressed(MouseEvent arg0) {
										
										if (bottoneRifiuta.isEnabled()){										
											try {
												boolean esito = serviceGate.rifiutaCondizione(negoziazione);
												if(!esito){
													JOptionPane.showMessageDialog(null, "Non permesso:\nSei già in attesa di risposta", "Informazione", JOptionPane.INFORMATION_MESSAGE);
												} else {
													JOptionPane.showMessageDialog(null, "Condizioni rifiutate", "Informazione", JOptionPane.INFORMATION_MESSAGE);
													frameNegozia.setVisible(false);
													frameVisualizza.setVisible(false);
													lcmw.setVisible(true);
												}
											} catch (UserNotLoggedException e) {
												// mettere il popup
												
											}										
										}
										
									}
									
									@Override
									public void mouseExited(MouseEvent arg0) {}
									
									@Override
									public void mouseEntered(MouseEvent arg0) {}
									
									@Override
									public void mouseClicked(MouseEvent arg0) {}
								
							    });
							    
							    
								
							    bottoneAggiungiCondizione.addMouseListener(	new MouseListener() {
									
									@Override
									public void mouseReleased(MouseEvent arg0) {}
									
									@Override
									public void mousePressed(MouseEvent arg0) {
										
										if (bottoneAggiungiCondizione.isEnabled()){
											
											// controllo che tutti i campi importanti siano stati completati
											if 	( (areaNuovaCondizione.getText() != null) && (!areaNuovaCondizione.getText().trim().equals("")) ) {
												
												try {
													boolean esito = serviceGate.aggiungiCondizione(negoziazione, areaNuovaCondizione.getText());
													if(!esito){
														JOptionPane.showMessageDialog(null, "Non permesso:\nSei già in attesa di risposta", "Informazione", JOptionPane.INFORMATION_MESSAGE);
													} else {
														JOptionPane.showMessageDialog(null, "Nuova condizione aggiuta", "Informazione", JOptionPane.INFORMATION_MESSAGE);
														frameNegozia.setVisible(false);
														frameVisualizza.setVisible(false);
														lcmw.setVisible(true);
													}
												} catch (UserNotLoggedException e) {
													// popup
												}
											}
											else{
												JOptionPane.showMessageDialog(null, "Non hai inserito nessuna condizione", "Inserimento errato", JOptionPane.INFORMATION_MESSAGE);
											}
							    
											
										}
										
									}
									
									@Override
									public void mouseExited(MouseEvent arg0) {}
									
									@Override
									public void mouseEntered(MouseEvent arg0) {}
									
									@Override
									public void mouseClicked(MouseEvent arg0) {}
								});
							    
							    
								
								//END
								frameNegozia.pack();
								//frameNuova.setSize(500,400);
								frameNegozia.setVisible(true);
								//frameNuova.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
								

							
							}		
						}

						@Override
						public void mouseExited(MouseEvent arg0) {}

						@Override
						public void mouseEntered(MouseEvent arg0) {}

						@Override
						public void mouseReleased(MouseEvent arg0) {}
						
					});
					
					//fine bottoneElimina

				}
			}
			else{
				
			}
			
			//END
			frameVisualizza.pack();
			//frameVisualizza.setSize(1000,400);
			frameVisualizza.setVisible(true);
			//frameVisualizza.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frameVisualizza.setResizable(false);
			
		} catch (UserNotLoggedException e) {
			lcmw.setVisible(true);
			JOptionPane.showMessageDialog(null, "Non sei loggato", "Errore", JOptionPane.ERROR_MESSAGE);
		}
	}
}
